package com.define.commons.dao.service;

import com.gitee.fastmybatis.core.query.Query;

import java.util.List;
import java.util.Map;

/**
 * 根据泛型提供基础 CRUD 的 Service
 * @Author xiewenlong
 * @Date 2018/10/31 12:49
 */
public interface FastMybatisBaseService<T, I> {

    /**
     * 根据实体的条件删除（可逻辑删除）
     * @param t 实体
     * @return
     */
    public int delete(T t);

    /**
     * 根据ID删除（可逻辑删除）
     * @param i ID
     * @return
     */
    public int deleteById(I i);

    /**
     * 根据条件删除（物理删除）
     * @param query 查询对象
     * @return
     */
    public int deleteByQuery(Query query);

    /**
     * 保存实体对象到数据库
     * @param t 实体
     * @return
     */
    public int save(T t);

    /**
     * 保存实体对象到数据库忽略空值
     * @param t 实体
     * @return
     */
    public int saveIgnoreNull(T t);

    /**
     * 批量保存（建议一次不要超过50条）
     * @param list 实体对象集合
     * @return
     */
    public int saveBatch(List<T> list);

    /**
     * 批量保存（兼容）
     * @param list 一组实体
     * @return
     */
    public int saveMulti(List<T> list);

    /**
     * 批量保存（兼容、忽略重复行）
     * @param list 一组实体
     * @return
     */
    public int saveMultiSet(List<T> list);

    /**
     * 根据ID获取一条记录
     * @param i ID
     * @return
     */
    public T getById(I i);

    /**
     * 根据查询对象获取一条记录
     * @param query 查询对象
     * @return
     */
    public T getByQuery(Query query);

    /**
     * 根据字段获取一条记录
     * @param s 字段
     * @param o 值
     * @return
     */
    public T getByColumn(String s, Object o);

    /**
     * 根据查询对象获取记录数
     * @param query 查询对象
     * @return
     */
    public long getCount(Query query);

    /**
     * 根据字段获取一组记录
     * @param s 字段
     * @param o 值
     * @return
     */
    public List<T> listByColumn(String s, Object o);

    /**
     * 根据查询对象获取一组记录
     * @param query 查询对象
     * @return
     */
    public List<T> list(Query query);

    /**
     * 根据查询对象获取指定字段
     * @param list 字段集合
     * @param query 查询对象
     * @return
     */
    public List<Map<String, Object>> listMap(List<String> list, Query query);

    /**
     * 根据实体对象修改保存到数据库
     * @param t 实体
     * @return
     */
    public int update(T t);

    /**
     * 根据实体对象修改保存到数据库忽略空值
     * @param t 实体
     * @return
     */
    public int updateIgnoreNull(T t);

    /**
     * 根据自定条件更新
     * @param o 实体
     * @param query 查询对象
     * @return
     */
    public int updateByQuery(Object o, Query query);

}
